import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.OutputStreamWriter;
import java.io.PrintWriter;
import java.io.StreamTokenizer;

public class qpow {
	static long n, a, b;
	static long mod = (long) 1000000007;

	public static void main(String[] args) throws IOException {
		BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
		StreamTokenizer st = new StreamTokenizer(br);
		PrintWriter pw = new PrintWriter(new OutputStreamWriter(System.out));
		while (st.nextToken() != StreamTokenizer.TT_EOF) {
//			long t = (long)st.nval;
			long t = 1;
			while (t-- > 0) {
//				st.nextToken();
				n = (long) st.nval;
//				pw.println(n);
				st.nextToken();
				a = (long) st.nval;
//				pw.println(a);
				st.nextToken();
				b = (long) st.nval;
//				pw.println(b);
				long res = 0;
//				pw.println("qpow(2,n,mod)--" + qpow(2, n, mod));
//				pw.println("combination(n, a)--" + combination(n, a));
//				pw.println("combination(n, b)--" + combination(n, b));
				long atemp = getMod(qpow(2, n, mod));
				long btemp = getMod(combination(n, a));
				long ctemp = getMod(combination(n, b) + 1);
				res = getMod(getMod(atemp-btemp)-ctemp);
//				res %= mod;
				pw.println(res);
			}
		}
		pw.flush();
		pw.close();
		br.close();
	}

	static long qpow(long n, long m, long p) {
		long res = 1l;
		while (m > 0) {
			if ((m & 1) == 1)
				res = res * n % p;
			n = n * n % p;
			m >>= 1;
		}
		return res;
	}

	public static long combination(long n, long m) {
		long res = 1l;
		for (long i = n; i >= (n - m + 1); i--) {
			res = res * i % mod;
		}
		for (long i = 1; i <= m; i++) {
			res = res * qpow(i, mod - 2, mod) % mod;
		}
		return res;
	}

	private static long getMod(long x) {
		return (x % mod + mod) % mod;
	}
}
